ИИ стандартный, полагаю? Стандартному ИИ вроде как вижн не важен, он и так знает где все находятся, если мне не изменяет память. Как от него не прячься, найдет сразу. Если уж очень хочется - давать юнитов нейтралам и делать их союзным всем ботам. (игроков 16, если не изменяет память). Или давать союзным игрокам, при наличии. По крайней мере не будут мчаться в след за армией. Однако вполне могут быть более качественные решения проблемы, я стандартный ИИ не изучал, не могу быть уверен в офигительности предложенного решения. :)
Бтв, про сбор команды - для продвинутых сущностей нередко исправлять за другими оказывается тяжелее, чем делать самому, важно создать максимально комфортные условия для созидания, вот для чего деньги не лишние, а уж дело и самому можно делать.
И, да, тема-то не про то, надо это или не надо, а про то, как лучше это сделать, я про это и в стартовом сообщении написал.
Я на крайний сам вопрос по варианту 3 проверю и/или будет сделан выбор между третьим вариантом, вторым, каким-то ещё и отказом от Cooldown Reduction, но если кто поможет - спасибо.
Я не понимаю как вы собираете решать (потому что не даете ответ развернутый). Так вот решение:
решение один. добавить в условие проверку на тип
тут нужно вместо hfoo поставить свой тип
function DuelChecking takes nothing returns nothing
local integer alliance_number=0
local integer akatsuki_number=0
local integer alliance_current=0
local integer akatsuki_current=0
local integer i=0
local unit hero_duel_1=null
local unit hero_duel_2=null
//идет первый цикл
//здесь введены специально счетчики для игроков от каждой команды
// alliance_number - кол-во играющих за добро и akatsuki_number - кол-во играющих за зло
//перебирает всех 10 игроков, если игрок играет, то прибавляет в счетчик
//эти счетчики - переменные целые. они высчитывают шанс.
loop
if i!=4 and i!=5 then
if GetPlayerSlotState(Player(i))==PLAYER_SLOT_STATE_PLAYING then
if i<4 then //<=здесь можно выставить условие ( GetUnitTypeId(udg_Hero[i]) != 'hfoo' ) выставите тип, и тогда счетчик не засчитаете его
set alliance_number=alliance_number+1
elseif i>5 then //<=или здесь можно выставить условие ( GetUnitTypeId(udg_Hero[i]) != 'hfoo' ) выставите тип, и тогда счетчик не засчитаете его
set akatsuki_number=akatsuki_number+1
endif
endif
endif
set i=i+1
exitwhen i>10
endloop
//идет второй цикл
//теперь снова перебираем тех же игроков.
//но пытаемся выдать шанс на то, что герой этого игрока выйдет на дуэль
set i=0
loop
if i!=4 and i!=5 then
if GetPlayerSlotState(Player(i))==PLAYER_SLOT_STATE_PLAYING then //если игрок играет
if i<4 and hero_duel_1==null then //если первый дуэлянт еще не выбран (дуэлянт выбирается от 1 до 4 игрока)
set alliance_current=alliance_current+1 //< странно эти переменная ничего не делает дальше.
//должна alliance_current по идее вычитать из общее количества. из этого шанс будет становится больше.
//например 3 игрока. 1/3=0.3 или 30 процентов. 2 игрока - 1/2=0.5 или 50 процентов
//if ( GetUnitTypeId(udg_Hero[i]) != 'hfoo' ) then <= здесь нужно поставить условие, тогда нагато никогда не выйдет на арену
if alliance_current<alliance_number then
if GetRandomInt(1,alliance_number)==1 then //выбирается рандомно.
set hero_duel_1=udg_Hero[i]
endif
elseif alliance_current==alliance_number then //если дуэлянт не выбран (если до этого шанс не выпад, то выбираем последнего игрока)
set hero_duel_1=udg_Hero[i]
endif
//endif
elseif i>5 and hero_duel_2==null then
set akatsuki_current=akatsuki_current+1 //< странно эти переменная ничего не делает дальше.
//должна akatsuki_current по идее вычитать из общее количества. из этого шанс будет становится больше.
//например 3 игрока. 1/3=0.3 или 30 процентов. 2 игрока - 1/2=0.5 или 50 процентов
//if ( GetUnitTypeId(udg_Hero[i]) != 'hfoo' ) then <= здесь нужно поставить условие, тогда нагато никогда не выйдет на арену
if akatsuki_current<akatsuki_number then
if GetRandomInt(1,akatsuki_number)==1 then //выбирается рандомно шанс
set hero_duel_2=udg_Hero[i]
endif
elseif akatsuki_current==akatsuki_number then
set hero_duel_2=udg_Hero[i]
endif
//endif
endif
endif
endif
set i=i+1
exitwhen i>10 or hero_duel_2!=null
endloop
if hero_duel_1!=null and hero_duel_2!=null then
call DuelStart(GetOwningPlayer(hero_duel_1),GetOwningPlayer(hero_duel_2))
else
call DisplayTimedTextToPlayer(GetLocalPlayer(),0.,0.,5.,"|cFFFFCC00Дуэль не состоялась!|r")
endif
set hero_duel_1=null
set hero_duel_2=null
endfunction
типы
какой из них имба? основное тело героя O014? кого из них отключать?
или может исключить имбу, а клонов в бой на арену? тогда придеться переделать систему.
функцию DuelPrestart надо перезаписать.
только вызывают целые вопросы. клоны - герои. если они мертвы, перед ареной их оживить, после арены убить?
есть карта я код с всеми способности нагато отсортировал для удобства
по поводу переключения
триггер выбора
function Nagato___PainClickGetJutsuCheck takes string str,integer whatValue returns integer
local integer l__Nagato_value=0
if str=="влево"then
if whatValue==5 then
if Nagato_PainExist[5]then
set l__Nagato_value=5
elseif Nagato_PainExist[4]then
set l__Nagato_value=4
elseif Nagato_PainExist[3]then
set l__Nagato_value=3
elseif Nagato_PainExist[2]then
set l__Nagato_value=2
elseif Nagato_PainExist[1]then
set l__Nagato_value=1
elseif Nagato_PainExist[6]then
set l__Nagato_value=6
endif
elseif whatValue==4 then
if Nagato_PainExist[4]then
set l__Nagato_value=4
elseif Nagato_PainExist[3]then
set l__Nagato_value=3
elseif Nagato_PainExist[2]then
set l__Nagato_value=2
elseif Nagato_PainExist[1]then
set l__Nagato_value=1
elseif Nagato_PainExist[6]then
set l__Nagato_value=6
elseif Nagato_PainExist[5]then
set l__Nagato_value=5
endif
elseif whatValue==3 then
if Nagato_PainExist[3]then
set l__Nagato_value=3
elseif Nagato_PainExist[2]then
set l__Nagato_value=2
elseif Nagato_PainExist[1]then
set l__Nagato_value=1
elseif Nagato_PainExist[6]then
set l__Nagato_value=6
elseif Nagato_PainExist[5]then
set l__Nagato_value=5
elseif Nagato_PainExist[4]then
set l__Nagato_value=4
endif
elseif whatValue==2 then
if Nagato_PainExist[2]then
set l__Nagato_value=2
elseif Nagato_PainExist[1]then
set l__Nagato_value=1
elseif Nagato_PainExist[6]then
set l__Nagato_value=6
elseif Nagato_PainExist[5]then
set l__Nagato_value=5
elseif Nagato_PainExist[4]then
set l__Nagato_value=4
elseif Nagato_PainExist[3]then
set l__Nagato_value=3
endif
elseif whatValue==1 then
if Nagato_PainExist[1]then
set l__Nagato_value=1
elseif Nagato_PainExist[6]then
set l__Nagato_value=6
elseif Nagato_PainExist[5]then
set l__Nagato_value=5
elseif Nagato_PainExist[4]then
set l__Nagato_value=4
elseif Nagato_PainExist[3]then
set l__Nagato_value=3
elseif Nagato_PainExist[2]then
set l__Nagato_value=2
endif
elseif whatValue==6 then
if Nagato_PainExist[6]then
set l__Nagato_value=6
elseif Nagato_PainExist[5]then
set l__Nagato_value=5
elseif Nagato_PainExist[4]then
set l__Nagato_value=4
elseif Nagato_PainExist[3]then
set l__Nagato_value=3
elseif Nagato_PainExist[2]then
set l__Nagato_value=2
elseif Nagato_PainExist[1]then
set l__Nagato_value=1
endif
endif
elseif str=="вправо"then
if whatValue==2 then
if Nagato_PainExist[2]then
set l__Nagato_value=2
elseif Nagato_PainExist[3]then
set l__Nagato_value=3
elseif Nagato_PainExist[4]then
set l__Nagato_value=4
elseif Nagato_PainExist[5]then
set l__Nagato_value=5
elseif Nagato_PainExist[6]then
set l__Nagato_value=6
elseif Nagato_PainExist[1]then
set l__Nagato_value=1
endif
elseif whatValue==3 then
if Nagato_PainExist[3]then
set l__Nagato_value=3
elseif Nagato_PainExist[4]then
set l__Nagato_value=4
elseif Nagato_PainExist[5]then
set l__Nagato_value=5
elseif Nagato_PainExist[6]then
set l__Nagato_value=6
elseif Nagato_PainExist[1]then
set l__Nagato_value=1
elseif Nagato_PainExist[2]then
set l__Nagato_value=2
endif
elseif whatValue==4 then
if Nagato_PainExist[4]then
set l__Nagato_value=4
elseif Nagato_PainExist[5]then
set l__Nagato_value=5
elseif Nagato_PainExist[6]then
set l__Nagato_value=6
elseif Nagato_PainExist[1]then
set l__Nagato_value=1
elseif Nagato_PainExist[2]then
set l__Nagato_value=2
elseif Nagato_PainExist[3]then
set l__Nagato_value=3
endif
elseif whatValue==5 then
if Nagato_PainExist[5]then
set l__Nagato_value=5
elseif Nagato_PainExist[6]then
set l__Nagato_value=6
elseif Nagato_PainExist[1]then
set l__Nagato_value=1
elseif Nagato_PainExist[2]then
set l__Nagato_value=2
elseif Nagato_PainExist[3]then
set l__Nagato_value=3
elseif Nagato_PainExist[4]then
set l__Nagato_value=4
endif
elseif whatValue==6 then
if Nagato_PainExist[6]then
set l__Nagato_value=6
elseif Nagato_PainExist[1]then
set l__Nagato_value=1
elseif Nagato_PainExist[2]then
set l__Nagato_value=2
elseif Nagato_PainExist[3]then
set l__Nagato_value=3
elseif Nagato_PainExist[4]then
set l__Nagato_value=4
elseif Nagato_PainExist[5]then
set l__Nagato_value=5
endif
endif
endif
return l__Nagato_value
endfunction
function cj_anonym__523 takes nothing returns nothing
set Nagato_painClickSound=false
call DestroyTimer(GetExpiredTimer())
endfunction
function Nagato___PainClickGetJutsu takes integer id,unit u,string str returns nothing
local boolean camLog=false
local integer i=1
loop
if Nagato_JutsuActive[i]!=0 then
call SetPlayerAbilityAvailable(Nagato_p,Nagato_JutsuActive[i],false)
endif
set i=i+1
exitwhen i>5
endloop
if str=="клик"then
set Nagato_PainSelectedNumberNext=0
if id==Nagato_PAIN_ID_1 then
set Nagato_JutsuActive[1]=0x41303959//A09Y
set Nagato_JutsuActive[2]=0x4130395A//A09Z
set Nagato_JutsuActive[3]=0x4130574C//A0WL
set Nagato_JutsuActive[4]=0x41304833//A0H3
set Nagato_JutsuActive[5]=0x41304530//A0E0
call Sound3D(u,"Nagato Pain 1 Chikushodo.mp3")
elseif id==Nagato_PAIN_ID_2 then
set Nagato_JutsuActive[1]=0x41304842//A0HB
set Nagato_JutsuActive[2]=0
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 2 Gakido.mp3")
elseif id==Nagato_PAIN_ID_3 then
set Nagato_JutsuActive[1]=0x41305730//A0W0
set Nagato_JutsuActive[2]=0
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 3 Ningendo.mp3")
elseif id==Nagato_PAIN_ID_4 then
set Nagato_JutsuActive[1]=0x41304157//A0AW
set Nagato_JutsuActive[2]=0x41304543//A0EC
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 4 Shurado.mp3")
elseif id==Nagato_PAIN_ID_5 then
set Nagato_JutsuActive[1]=0x41304741//A0GA
set Nagato_JutsuActive[2]=0x41305658//A0VX
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 5 Jigokudo.mp3")
elseif id==Nagato_PAIN_ID_6 then
set Nagato_JutsuActive[1]=0x41303551//A05Q
set Nagato_JutsuActive[2]=0x41303534//A054
set Nagato_JutsuActive[3]=0x41303457//A04W
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 6 Tendo.mp3")
endif
elseif str=="влево"then
set camLog=true
if Nagato_PainSelectedNumberNext==0 then
if Nagato_PainExist[6]then
set Nagato_PainSelectedNumberNext=6
elseif Nagato_PainExist[5]then
set Nagato_PainSelectedNumberNext=5
elseif Nagato_PainExist[4]then
set Nagato_PainSelectedNumberNext=4
elseif Nagato_PainExist[3]then
set Nagato_PainSelectedNumberNext=3
elseif Nagato_PainExist[2]then
set Nagato_PainSelectedNumberNext=2
elseif Nagato_PainExist[1]then
set Nagato_PainSelectedNumberNext=1
endif
endif
if Nagato_PainExist[6]and Nagato_PainSelectedNumberNext==6 then
set u=Nagato___PainUnit[6]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("влево",5)
set Nagato_JutsuActive[1]=0x41303551
set Nagato_JutsuActive[2]=0x41303534
set Nagato_JutsuActive[3]=0x41303457
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 6 Tendo.mp3")
elseif Nagato_PainExist[5]and Nagato_PainSelectedNumberNext==5 then
set u=Nagato___PainUnit[5]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("влево",4)
set Nagato_JutsuActive[1]=0x41304741
set Nagato_JutsuActive[2]=0x41305658
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 5 Jigokudo.mp3")
elseif Nagato_PainExist[4]and Nagato_PainSelectedNumberNext==4 then
set u=Nagato___PainUnit[4]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("влево",3)
set Nagato_JutsuActive[1]=0x41304157
set Nagato_JutsuActive[2]=0x41304543
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 4 Shurado.mp3")
elseif Nagato_PainExist[3]and Nagato_PainSelectedNumberNext==3 then
set u=Nagato___PainUnit[3]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("влево",2)
set Nagato_JutsuActive[1]=0x41305730
set Nagato_JutsuActive[2]=0
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 3 Ningendo.mp3")
elseif Nagato_PainExist[2]and Nagato_PainSelectedNumberNext==2 then
set u=Nagato___PainUnit[2]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("влево",1)
set Nagato_JutsuActive[1]=0x41304842
set Nagato_JutsuActive[2]=0
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 2 Gakido.mp3")
elseif Nagato_PainExist[1]and Nagato_PainSelectedNumberNext==1 then
set u=Nagato___PainUnit[1]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("влево",6)
set Nagato_JutsuActive[1]=0x41303959
set Nagato_JutsuActive[2]=0x4130395A
set Nagato_JutsuActive[3]=0x4130574C
set Nagato_JutsuActive[4]=0x41304833
set Nagato_JutsuActive[5]=0x41304530
call Sound3D(u,"Nagato Pain 1 Chikushodo.mp3")
endif
elseif str=="вправо"then
set camLog=true
if Nagato_PainSelectedNumberNext==0 then
if Nagato_PainExist[1]then
set Nagato_PainSelectedNumberNext=1
elseif Nagato_PainExist[2]then
set Nagato_PainSelectedNumberNext=2
elseif Nagato_PainExist[3]then
set Nagato_PainSelectedNumberNext=3
elseif Nagato_PainExist[4]then
set Nagato_PainSelectedNumberNext=4
elseif Nagato_PainExist[5]then
set Nagato_PainSelectedNumberNext=5
elseif Nagato_PainExist[6]then
set Nagato_PainSelectedNumberNext=6
endif
endif
if Nagato_PainExist[1]and Nagato_PainSelectedNumberNext==1 then
set u=Nagato___PainUnit[1]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("вправо",2)
set Nagato_JutsuActive[1]=0x41303959
set Nagato_JutsuActive[2]=0x4130395A
set Nagato_JutsuActive[3]=0x4130574C
set Nagato_JutsuActive[4]=0x41304833
set Nagato_JutsuActive[5]=0x41304530
call Sound3D(u,"Nagato Pain 1 Chikushodo.mp3")
elseif Nagato_PainExist[2]and Nagato_PainSelectedNumberNext==2 then
set u=Nagato___PainUnit[2]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("вправо",3)
set Nagato_JutsuActive[1]=0x41304842
set Nagato_JutsuActive[2]=0
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 2 Gakido.mp3")
elseif Nagato_PainExist[3]and Nagato_PainSelectedNumberNext==3 then
set u=Nagato___PainUnit[3]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("вправо",4)
set Nagato_JutsuActive[1]=0x41305730
set Nagato_JutsuActive[2]=0
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 3 Ningendo.mp3")
elseif Nagato_PainExist[4]and Nagato_PainSelectedNumberNext==4 then
set u=Nagato___PainUnit[4]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("вправо",5)
set Nagato_JutsuActive[1]=0x41304157
set Nagato_JutsuActive[2]=0x41304543
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 4 Shurado.mp3")
elseif Nagato_PainExist[5]and Nagato_PainSelectedNumberNext==5 then
set u=Nagato___PainUnit[5]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("вправо",6)
set Nagato_JutsuActive[1]=0x41304741
set Nagato_JutsuActive[2]=0x41305658
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 5 Jigokudo.mp3")
elseif Nagato_PainExist[6]and Nagato_PainSelectedNumberNext==6 then
set u=Nagato___PainUnit[6]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("вправо",1)
set Nagato_JutsuActive[1]=0x41303551
set Nagato_JutsuActive[2]=0x41303534
set Nagato_JutsuActive[3]=0x41303457
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 6 Tendo.mp3")
endif
endif
set i=1
loop
if Nagato_PainExist[i]then
if Nagato___PainUnit[i]==u then
call SetTextTagColor(Nagato___PainText[i],165,253,0,0)
else
call SetTextTagColor(Nagato___PainText[i],255,255,255,0)
endif
endif
set i=i+1
exitwhen i>6
endloop
set i=1
loop
if Nagato_JutsuActive[i]!=0 then
if GetUnitAbilityLevel(Nagato_c,Nagato_JutsuActive[i])>0 then
call SetPlayerAbilityAvailable(Nagato_p,Nagato_JutsuActive[i],true)
else
call UnitAddAbility(Nagato_c,Nagato_JutsuActive[i])
endif
endif
set i=i+1
exitwhen i>5
endloop
set Nagato_painClickSound=true
call TimerStart(CreateTimer(),1.,false,function cj_anonym__523)
if GetLocalPlayer()==Nagato_p then
call ClearSelection()
call SelectUnit(Nagato_c,true)
endif
if camLog then
if GetLocalPlayer()==Nagato_p then
call ResetToGameCamera(0.)
call PanCameraToTimed(GetWidgetX(u),GetWidgetY(u),0.)
endif
endif
set Nagato___PainClicked=null
endfunction
function Nagato___PainClickConditions takes nothing returns boolean
return GetTriggerPlayer()==Nagato_p and IsUnitPain(GetTriggerUnit())and Nagato___PainClickNumber<2
endfunction
function cj_anonym__524 takes nothing returns nothing
set Nagato___PainClickNumber=Nagato___PainClickNumber-1
call DestroyTimer(GetExpiredTimer())
endfunction
function Nagato___PainClickActions takes nothing returns nothing
local unit u=GetTriggerUnit()
local integer i=1
set Nagato___PainClickNumber=Nagato___PainClickNumber+1
if not Nagato___PainFirst then
set Nagato___PainFirst=true
call DisplayTimedTextToPlayer(Nagato_p,0.,0.,20.,"|cFFFF5000Чтобы открыть способности Пейнов, используйте стрелки влево-вправо-вниз на клавиатуре, либо в течение 0,25 секунд выберите нужного Пейна дважды!|r")
endif
if Nagato___PainClickNumber==1 then
set Nagato___PainClicked=u
endif
if Nagato___PainClickNumber==2 and u==Nagato___PainClicked then
call Nagato___PainClickGetJutsu(GetUnitTypeId(u),u,"клик")//+
endif
call TimerStart(CreateTimer(),.25,false,function cj_anonym__524)//+
set u=null
endfunction
кнопки переключения
function Nagato___PainKeyDownConditions takes nothing returns boolean
return GetUnitAbilityLevel(udg_Hero[GetPlayerId(GetTriggerPlayer())],Nagato_RIKUDO_CANCEL)>0
endfunction
function Nagato___PainKeyDownActions takes nothing returns nothing
local integer i=1
if GetLocalPlayer()==Nagato_p then
call ClearSelection()
call SelectUnit(Nagato_c,true)
endif
loop
if Nagato_PainExist[i]then
if GetLocalPlayer()==Nagato_p then
call SelectUnit(Nagato___PainUnit[i],true)
endif
endif
set i=i+1
exitwhen i>6
endloop
endfunction
function Nagato___PainKeyRightConditions takes nothing returns boolean
return GetUnitAbilityLevel(udg_Hero[GetPlayerId(GetTriggerPlayer())],Nagato_RIKUDO_CANCEL)>0
endfunction
function Nagato___PainKeyRightActions takes nothing returns nothing
call Nagato___PainClickGetJutsu(0,null,"вправо")
endfunction
function Nagato___PainKeyLeftConditions takes nothing returns boolean
return GetUnitAbilityLevel(udg_Hero[GetPlayerId(GetTriggerPlayer())],Nagato_RIKUDO_CANCEL)>0
endfunction
function Nagato___PainKeyLeftActions takes nothing returns nothing
call Nagato___PainClickGetJutsu(0,null,"влево")
endfunction
Ваш ресурс не прошёл автомодерацию. Пожалуйста, внесите исправления или ожидайте проверки модератором.
Причина
Длина текста: 66, а требуется не менее 400
Условия прохождения автомодерации:
Описание вакансий должно быть подробным: опишите требования к знаниям и умениям, чем человек будет заниматься и что вы предлагаете со своей стороны. Подробнее про вакансии и найм
Your resource has not passed automoderation. Please make corrections or wait for the moderator to check.
Reason
Text length is: 66, but required not less than 400
Я удалял всеь код кроме етой системы все ефект тотже. также я писал что переносил наработку на иную мапу и там все работало. понятно что проблема не в коде..по тому как баг в том что рынок(юнит) меняет владельца, на красного скажем, еслиб не менял багаб небыло, но есть карта где он есть.. на разных мапах при абсолютно едентичных настройках юнитов, и коде(никакого второстепенного кода нет тока тот что в 1м посту)
опшем так я психанул и начал отрезать куски из мапы, сначала в 10 раз удалил весь код кроме наработки, затем удалил итемы, и вернул код и вот чудо баг пропал, =============================================================================
думаю проблема была в том что иды предметам я в ручную прописывал, там была своя закономерность, но увы теперь придется периписать все иды предметов, и заминить их в коде что очень ни удобно и моторно=(
А это никого не смущает? то что локалки поставлены не первыми
function Trig_treeegs_Actions takes nothing returns nothing
set udg_Unitper = GetSpellAbilityUnit()
local unit Usp = udg_Unitper
local unit orud1
local unit orud2
local unit orud3
. . .
В общем - рано тебе ещё прям так полностью переходить на Jass. Тут надо переделывать всё, начиная с момента удаления создаваемого эффекта, и вплоть до момента созданиея юнита по XY. А так же момент с полярными смещениями (ты там вообще лишнюю область создаёшь, а значит не знаешь как надо правильно полярки использовать на GUI).
У твоей модели, которая добавляется, вероятно есть нестандартные текстуры. Нужно правильно расположить модель относительно ее текстур. Насколько я помню, я их располагал в одну папку и, вроде как, работало.
Чтобы удалить предмет из лавки триггерно, его туда нужно сначала добавить триггерно. Т.е на карте появляется лавка гоблина вобще без предметов, в РО - в поле предметов продано = 0, никаких предметов. Потом этой конкретной лавке в триггере настраиваем ассортимент, ну и меняем его как хотим в процессе игры.
Your resource has not passed automoderation. Please make corrections or wait for the moderator to check.
Reason
There must be a file of one of the following types: mdl, mdx, fbx, obj, max, blend, mb, ma, 3ds, dae, dxf, usd, usdz, stl, stp, wrl, m2, zip, 7z, rar, tar, gz, apk, gzip, jar, lzip, tgz, tbz2, bz2, zipx, zz, dmg, ipg, z, iso
фиксировать угол при применении и постоянно выравнивать юнита при периодической проверке
если ставить скорость поворота 0 - у юнита начнутся проблемы с движением
так не поймешь, чего у тебя там не работает. Опиши ПОДРОБНО чего сделать не так, что она не работает. раньше работала?
Скидывай скрин ошибки, карту. В папке варкрафт есть папка "Errors" там текстовик нужно найти.
предположение
Пробовал выключить или временно удалить все триггеры? если без триггеров нормально работает - вывод?
похоже автор какую-нибудь карту открыл, отредактировал ландшафт. Она там мб, к примеру, на cjass написано. попробуй xgm.guru/p/wc3/178775 Если ошибка будет на jngp, там есть в папке jngp есть папка "logs" тоже ошибки хранит
Еще может быть нужно включить UMS. Даже, если без триггеров не сохраняет, возможно какие-нибудь за какие-нибудь ограничения (кол-во деревьев, размер карты и прочее).
ты знаешь начальные хп декораций
ты можешь отловить факт приказа добывать дерево и OrderTargetDestructable
ты можешь перезаписывать этот триггер каждый раз, как юнит получает новый приказ, хотя хз, как оно себя ведет при смене дерева
нормального способа задетектить урон по не-юнитам нет
Ваш ресурс не прошёл автомодерацию. Пожалуйста, внесите исправления или ожидайте проверки модератором.
Причина
Должен присутствовать файл одного из типов: w3m, w3x, scm, scx, sc2map, sc2ma, pud, w3n, sc2mod, zip, 7z, rar, tar, gz, apk, gzip, jar, lzip, tgz, tbz2, bz2, zipx, zz, dmg, ipg, z, iso
Your resource has not passed automoderation. Please make corrections or wait for the moderator to check.
Reason
There must be a file of one of the following types: w3m, w3x, scm, scx, sc2map, sc2ma, pud, w3n, sc2mod, zip, 7z, rar, tar, gz, apk, gzip, jar, lzip, tgz, tbz2, bz2, zipx, zz, dmg, ipg, z, iso
ладно, ты наверное не разобрался либо занят, в общем я решил сделать пример
вот основной код
globals
constant hashtable H = InitHashtable( )
constant group TempGroup = CreateGroup( )
endglobals
function addEff takes nothing returns nothing
local timer t = GetExpiredTimer( )
local unit u = LoadUnitHandle( H, GetHandleId( t ), 0 )
local EffectS A = LoadInteger( H, GetHandleId( u ), EffectStructKey )
set A.eff = AddSpecialEffectTarget( "Abilities\\Weapons\\FarseerMissile\\FarseerMissile.mdl", u, "weapon" )
set A.eff2 = AddSpecialEffectTarget( "Abilities\\Weapons\\ZigguratMissile\\ZigguratMissile.mdl", u, "weapon" )
call FlushChildHashtable( H, GetHandleId( t ) )
call DestroyTimer( t )
set t = null
set u = null
endfunction
function poisonDamage takes nothing returns nothing
local timer t = GetExpiredTimer( )
local integer i = GetHandleId( t )
local unit attacker = LoadUnitHandle( H, i, 0 )
local unit damaged = LoadUnitHandle( H, i, 1 )
local real r = LoadReal( H, i, 3 ) - 1.00
call UnitDamageTarget( attacker, damaged, 20.00, false, false, null, null, null )
if r <= 0.00 or not UnitAlive( damaged ) then
call RemoveSavedHandle( H, GetHandleId( attacker ), GetHandleId( damaged ) )
call DestroyEffect( LoadEffectHandle( H, i, 2 ) )
call DestroyTimer( t )
call FlushChildHashtable( H, i )
else
call SaveReal( H, i, 3, r )
endif
set t = null
set attacker = null
set damaged = null
endfunction
function FlamingAttacks_Actions takes nothing returns nothing
local unit attacker = GetEventDamageSource( )
local unit damaged = GetTriggerUnit( )
local real damage = GetEventDamage( )
local unit u
local timer t
local EffectS A
if GetUnitAbilityLevel( damaged, 'Bssd' ) > 0 then
call UnitRemoveAbility( damaged, 'Bssd' )
// потужні удари
if GetUnitAbilityLevel( attacker, 'A002' ) > 0 then
call GroupEnumUnitsInRange( TempGroup, GetUnitX( damaged ), GetUnitY( damaged ), 300.00, null )
loop
set u = FirstOfGroup( TempGroup )
exitwhen u == null
call GroupRemoveUnit( TempGroup, u )
if IsUnitEnemy( u, GetOwningPlayer( attacker ) ) and UnitAlive( u ) then
call UnitDamageTarget( attacker, u, damage, false, false, null, null, null )
endif
endloop
set t = CreateTimer( )
set A = LoadInteger( H, GetHandleId( attacker ), EffectStructKey )
call DestroyEffect( A.eff )
call DestroyEffect( A.eff2 )
call DestroyEffect( AddSpecialEffect( "Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl", GetUnitX( damaged ), GetUnitY( damaged ) ) )
call SaveUnitHandle( H, GetHandleId( t ), 0, attacker )
call TimerStart( t, 1.00, false, function addEff )
set t = null
elseif GetUnitAbilityLevel( attacker, 'A003' ) > 0 then
// вогняна атака
call GroupEnumUnitsInRange( TempGroup, GetUnitX( damaged ), GetUnitY( damaged ), 150.00, null )
loop
set u = FirstOfGroup( TempGroup )
exitwhen u == null
call GroupRemoveUnit( TempGroup, u )
if u != damaged and IsUnitEnemy( u, GetOwningPlayer( attacker ) ) and UnitAlive( u ) then
call UnitDamageTarget( attacker, u, damage / 2.00, false, false, null, null, null )
endif
endloop
set t = LoadTimerHandle( H, GetHandleId( attacker ), GetHandleId( damaged ) )
if t == null then
set t = CreateTimer( )
call SaveTimerHandle( H, GetHandleId( attacker ), GetHandleId( damaged ), t )
call SaveUnitHandle( H, GetHandleId( t ), 0, attacker )
call SaveUnitHandle( H, GetHandleId( t ), 1, damaged )
call SaveEffectHandle( H, GetHandleId( t ), 2, AddSpecialEffectTarget( "Abilities\\Spells\\Other\\BreathOfFire\\BreathOfFireDamage.mdl", damaged, "origin" ) )
call TimerStart( t, 1.00, true, function poisonDamage )
endif
call SaveReal( H, GetHandleId( t ), 3, 5.00 )
call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Spells\\Items\\AIfb\\AIfbSpecialArt.mdl", damaged, "chest" ) )
call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Weapons\\RedDragonBreath\\RedDragonMissile.mdl", damaged, "chest" ) )
set t = null
endif
endif
set damaged = null
set attacker = null
endfunction
//===========================================================================
//function InitTrig_FlamingAttacks takes nothing returns nothing
//set gg_trg_FlamingAttacks = CreateTrigger( )
//endfunction
а) Создай 2 переменные-массива по типу "боевая единица" (массив - чтобы для каждого игрока, мы ведь за мультиплеер трем, прально?), назови типа MyChampion и MyChampionDummy.
б) подготовь невидимого героя-пустышку с нужной тебе иконкой, убери ману, если у чемпиона ее нет. Убери ему радиус обзора, убери галочки типа "отмечать на мини-карте" - остальные - опционально.
В дальнейшем мы будем синхронизировать пустышку и реального чемпиона, создавая видимость одной боевой единицы.
Итак, наш первый триггер:
в) Отследи первое появление чемпиона, когда это случится - создай для игрока героя-пустышку. Соответственно сделай MyChampion [number of (Owner of trained unit)]= last trained unit, следующей строчкой создай того самого героя-пустышку для (owner of trained unit) и сделай MyChampionDummy = last created unit. Теперь мы прочно связали этих чуваков. Этот же триггер запускает остальные.
г) Отслеживание здоровья. Сделай изначально выключенный цикличный триггер, там, каждые 0.3 секунды. Триггер запускается пунктом в). Каждые 0.3 секунды меняй здоровье героя (чья икона висит, надо чтобы она соответствовала, прально?) в % на здоровье самого чемпиона.
д) пропищи событие, мол, если выбирает игрок своего героя (кликая на иконку) выбирается чемпион
е) убивай героя вместе с чемпионом
ж) отключай триггеры с проверкой и выбором, пока чемпион мертв
з) не забывай обновлять переменную чемпиона с каждым новым чемпионом.
» WarCraft 3 / а как удалить свой ресурс
» WarCraft 3 / Defender of Dazar'alor
» WarCraft 3 / Как пофиксить башню танка?
» WarCraft 3 / Спасение деревни
» WarCraft 3 / Silvergard-Вакансии
Описание вакансий должно быть подробным: опишите требования к знаниям и умениям, чем человек будет заниматься и что вы предлагаете со своей стороны. Подробнее про вакансии и найм
» WarCraft 3 / А что не так с этой строкой?
» WarCraft 3 / Что не так с этой строкой
» WarCraft 3 / Как включить триггер с функциями на Jass
» WarCraft 3 / Подскажите пожалуйста
» WarCraft 3 / (дубликат) Гильдия Наемников by POMEXI | Город | Конкурсная работа
» WarCraft 3 / DAMAGE_TYPE
» WarCraft 3 / Нити судьбы: Вечность тьмы (Часть 1)
» WarCraft 3 / Скорость поворота юнита
» WarCraft 3 / Ошибка при сохранении карты
» WarCraft 3 / Прочность предмета
» Game Dev / Злоключение Дианы
» WarCraft 3 / Битва за Терамор 4.2 [FINAL].
» WarCraft 3 / Предмет, который наносит урон при использовании
» WarCraft 3 / Проблема с иконкой в интерфейсе.